今天我們繼續來認識 Decimal
:
Decimal
constructor 接受許多種資料類型:
import decimal
from decimal import Decimal
比如整數:
Decimal(10)
Decimal('10')
Decimal(-10)
Decimal('-10')
也可以傳入字串:
Decimal('0.1')
Decimal('0.1')
Decimal('-3.1415')
Decimal('-3.1415')
甚至可以傳入 Tuple:
Decimal ((0, (3,1,4,1,5), -4))
Decimal('3.1415')
Decimal((1, (1,2,3,4), -3))
Decimal('-1.234')
Decimal((0, (1,2,3), 3))
Decimal('1.23E+5')
Tuple 的第一個變數代表正負(0正1負),中間的 tuple 代表數字每個位數的值,最後的變數代表 10 的N次方。
Decimal((0, (1,2,3), 3))
代表 123 * 10^3 = 123000 = 1.23E+5
format(0.1, '.25f')
'0.1000000000000000055511151'
Decimal(0.1)
Decimal('0.1000000000000000055511151231257827021181583404541015625')
觀察上面例子可以發現,因為大多數 float
是估計值,傳入 Decimal
反而完整的存下了這個估計值,而不是我們真正想要的精確小數。
使用 string
代替 float
傳入 Decimal
Context precision 作用不是設定 Decimal
物件創建時的精細度,而是影響數學運算時的精細度。
decimal.getcontext().prec = 2
我們創建小數點後五位的 Decimal
物件:
a = Decimal('0.12345')
b = Decimal('0.12345')
a
Decimal('0.12345')
b
Decimal('0.12345')
仍然是五位小數,但當我們對它們做加法時,context precision 就會發生作用:
a+b
Decimal('0.25')
運算的結果近似到小數點後兩位 (precision = 2)。
好啦,我們明天見~
參考:Python 3: Deep Dive (Part 1 - Functional)